﻿#pragma once
#include "XyNet/Common/Singleton.h"
#include <random>

namespace XyNet
{
	/// 伪随机数发生器
	class XYNET_API Random : public DefaultObject<Random>
	{
	public:
		/// 使用真随机设备产生种子
		Random();
		/// 指定种子
		Random(int seed);

		/// 返回一个非负随机整数。[0,0x7FFFFFFF]
		int nextInt();
		/// 返回一个小于所指定最大值的非负随机整数。[0,maxValue]
		int nextInt(int maxValue);
		/// 返回在指定范围内的任意整数。[minValue,maxValue]
		int nextInt(int minValue, int maxValue);
		/// 返回一个大于或等于 0.0 且小于 1.0 的随机浮点数。[0,1)
		real nextReal();
		/// 用随机数填充指定字节数组的元素。
		void nextBytes(Bytes* bytes);

		/// 随机事件是否发生。probability（概率）在[0, 1]之间
		bool isRandomHappen(real probability);

	private:
		/// 随机数发生器
		std::mt19937 _randomGenerator;
	};
}